#include <head.h>

// 声明互斥锁
pthread_mutex_t mutex;
// 声明条件变量
pthread_cond_t cond;
// 标记
int flag = 0;

// 生成数量
int val = 0;



// 生产者函数
void * Producer_Func(void * arg)
{
    while (1)
    {
        sleep(1);
        // 互斥锁 上锁
        pthread_mutex_lock(&mutex);

        // 生成
        printf("生产者生产\n");
        val ++;
        flag = 1;

        // 发信号 通知消费者 可以开始消费了
        pthread_cond_signal(&cond);
        // 互斥锁 解锁
        pthread_mutex_unlock(&mutex);
    }
    
}
// 同步的事情  必须让某某某先运行 然后 自己才能运行
/*
两者强锁

生产者 消费者

生产者 必须先开始运行
然后 消费者才能运行

同步

必须 生产者 先运行  消费者 后运行
哪怕 消费先强锁

*/
// 消费者函数
void * Consumer_Func(void * arg)
{
    while (1)
    {
        // 互斥锁 上锁
        pthread_mutex_lock(&mutex);

        // 等待条件变量
        while (flag == 0)
        {
            printf("aaaaa\n");
            pthread_cond_wait(&cond , &mutex);
            // 等待信号 并解锁
            /*
                生产者抢到锁   判断 cond 是否有信号  
                    如果有 cond 继续运行 mutex上锁
                    如果没有 cond 阻塞 mutex解锁
                    

                    消费者1  拿到信号

                    消费者2 没有信号

                    当消费者1 运行完成 并释放后 消费2强锁 然后信号还没有消除 这个时候会发生什么问题
            */
        }

        // 购买消费
        val --;
        printf("生产者消费\n");
        flag = 0;

        // 互斥锁 解锁
        pthread_mutex_unlock(&mutex);
    }
    
}

int main(int argc, char const *argv[])
{   
    // 初始化互斥锁
    pthread_mutex_init(&mutex , NULL);

    // 初始化条件变量
    pthread_cond_init(&cond , NULL);

    // 定义线程的变量
    pthread_t Producer_tid;
    pthread_t Consumer_tid;
   
    // 创建生产者和消费者函数  
    pthread_create(&Producer_tid , NULL , Producer_Func , NULL);
    pthread_create(&Consumer_tid , NULL , Consumer_Func , NULL);

    // 回收线程
    pthread_join(Producer_tid , NULL);
    pthread_join(Consumer_tid , NULL);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
    // 销毁条件变量
    pthread_cond_destroy(&cond);

    return 0;
}


/*
生产者 和 消费者
生产者  生产了一辆车
消费者  购买了一辆车

*/